perm filename DSKMON[SS,SYS]2 blob sn#354660 filedate 1978-05-18 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE DSKMON DISK STATISTICS MONITOR
C00004 00003	GO:	RESET
C00006 00004	SWR:	JRST 2,@[.+1]		LEAVE IOT USER MODE
C00013 00005	DPERCNT:IDIVI A,=100
C00016 00006	IFN OLDDSK,<
C00021 ENDMK
C⊗;
TITLE DSKMON DISK STATISTICS MONITOR

OLDDSK←←0			;-1 TO ASSEMBLE FOR OLD SYSTEM WITH DISK QUEUE

A←1
B←2
C←3
D←4
E←5
T←6
TT←7
Q←10
DDB←11
DAT←12
S←13
L←14

P←17

DDPMAX←←1000		;MAXIMUM SIZE OF DATA DISK PROGRAM
FLINE←←3		;FIRST TEXT LINE TO DISPLAY ON
FSLINE←←3*=12		;FIRST SCAN LINE

DEFINE CW (OP1,D1,OP2,D2,OP3,D3) <
	BYTE (8) D1,D2,D3 (3) OP1,OP2,OP3,4
>

FN←←1
CH←←2
COL←←3
HILINE←←4
LOLINE←←5

HS←←400000		;FOR REFERENCES TO SYSTEM CORE

DEFINE INFORM (A,B) <
PRINTS /A=B
/
>

DEFINE DDCLR (ADR,NWDS) <
ZZ←←0
REPEAT NWDS,<
	ADR+ZZ
ZZ←←ZZ+1
>
>

;LOW CORE POINTERS
CHKBEG←←223
SYSTOP←←265
GO:	RESET
	MOVE P,[-100,,PDL-1]
	SETZM FREEZE
	PUSHJ P,SYMLK		;LOOKUP SYSTEM SYMBOLS
	DPYSIZ 2*1000+2
	DPYPOS -600
	MOVEI A,CHKBEG
	PEEK A,
	MOVEI A,233000		;KLUDGE TO GET PATCH AREA
	MOVEM A,SLOPC
	LSH A,-9		;# LO PIECE PAGES
	MOVEI B,SYSTOP
	PEEK B,
	PEEK B,
	MOVEM B,FHIADR
	LSH B,-9+5		;STARTING HI PIECE PAGE # * 40
	ADDI B,10		;SET 2-PEICE FLAG
	HRL B,A
	GETHI B,
	JRST 4,.
	SETOM SWCNT
	MOVE A,[400017,,SWR]
	SKIPN DEBUG
	SPCWGO A,		;START UP SPACEWAR
	SKIPE DEBUG
	JRST SWR
MLOOP:	INCHRW A
;	TRNN A,600
;	JRST MLOOP
	LDB B,[POINT 7,A,35]
	CAIL B,"a"
	CAILE B,"z"
	CAIA
	SUBI B,40
	CAIN B,"E"
	PUSHJ P,EXT
	CAIN B,40
	SETCMM FREEZE
	JRST MLOOP

EXT:	SPCWAR 'SSW'		;KILL THE SPACEWAR MODULE
	PUSH P,DDCLRS+1
	SETZM DDCLRS+1
	DDUPG DDCLRS		;WAIT FOR SPACE WAR LEVEL TRANSFER TO FINISH
	POP P,DDCLRS+1
	DDUPG DDCLRS		;CLEAR THE SCREEN
	RESET			;RESET THE WORLD
	EXIT
SWR:	JRST 2,@[.+1]		;LEAVE IOT USER MODE
	SKIPE FREEZE
	JRST SWXIT
	SKIPE DEBUG
	JRST SWDEB
	AOSE SWCNT
	DISMIS
	MOVNI A,4
	MOVEM A,SWCNT
SWDEB:	MOVE P,[-100,,SPWPDL-1]
	PUSHJ P,SYMEXM		;EXAMINE SYSTEM SYMBOLS
	PUSHJ P,DDPSET
IFN OLDDSK,<
	MOVE Q,[-DDPMAX,,DDPRG1-1]
>;IFN OLDDSK
	PUSHJ P,MKDIS
IFN OLDDSK,<
	PUSHJ P,CLRRST		;CLEAR THE REST OF THE LINES
	PUSH Q,[0]
	HLRO Q,Q
	ADDI Q,DDPMAX+DDPRG1-DDPROG+1	;SIZE OF DISPLAY PROGRAM
>;IFN OLDDSK
IFE OLDDSK,<
	MOVEI Q,DDPEND-DDPROG
>;IFE OLDDSK
	MOVEM Q,DDLWRD		;STORE IN HEADER
	DDUPG DDHEAD
SWXIT:	SKIPN DEBUG
	DISMIS
	JRST SWR

MKDIS:	MOVE A,NSWPOP
	MOVE D,[440700,,DSWPOP]
	PUSHJ P,DDECOUT
	PUSHJ P,DCRLF
	MOVE A,NTSTAR
	MOVE D,[440700,,DTSTAR]
	PUSHJ P,DDECOUT
	PUSHJ P,DCRLF
	MOVE A,NSWPOP
	MOVE B,NTSTAR
	ADD B,A
	IMULI A,=10000
	IDIV A,B
	MOVE D,[440700,,DPER1]
	PUSHJ P,DPERCNT
	PUSHJ P,DCRLF
REPEAT 0,<
	MOVE A,SWPTWC
	MOVE D,[440700,,DSWPTW]
	PUSHJ P,DDECOUT
	PUSHJ P,DCRLF
	MOVE A,DSKTWC
	MOVE D,[440700,,DDSKTW]
	PUSHJ P,DDECOUT
	PUSHJ P,DCRLF
>;REPEAT 0
	MOVE A,SWPTWC
	MULI A,=10000
	MOVE C,SWPTWC
	ADD C,DSKTWC
	DIV A,C
	MOVE D,[440700,,DPER2]
	PUSHJ P,DPERCNT
	PUSHJ P,DCRLF
	MOVE A,SWPTWC
	IDIV A,NSWPOP
	MOVE D,[440700,,DSIZ1]
	PUSHJ P,DDECOUT
	MOVEI A,[ASCIZ / WORDS
/]
	PUSHJ P,DTYPE
	MOVE A,DSKTWC
IFN OLDDSK,<
	SUB A,SWPTWC
>;IFN OLDDSK
	IDIV A,NTSTAR
	MOVE D,[440700,,DSIZ2]
	PUSHJ P,DDECOUT
	MOVEI A,[ASCIZ / WORDS
/]
	PUSHJ P,DTYPE
	DMOVE D,DKTIME
	DIV D,[10000*=1000000]	;CONVERT TO SECONDS
	MOVE A,SWPTWC
	ADD A,DSKTWC		;TOTAL WORDS TRANSFERRED
	IDIV A,D		;AVERAGE TRANSFER RATE
	MOVE D,[440700,,DRATE]
	PUSHJ P,DDECOUT
	MOVEI A,[ASCIZ \ W/S
\]
	PUSHJ P,DTYPE
	MOVE A,NJRNUL
	SUB A,LNJRNUL
	MOVE B,UPTIME
	SUB B,LUPTIME
	IMULI A,=100
	IDIV A,B		;% OF RECENT UPTIME THAT WAS WASTED
	MOVE D,[440700,,DPER3]
	PUSHJ P,DDECOUT
	PUSHJ P,DCRLF
	MOVE A,NWSCHED
	SUB A,LNWSCHED
	IMULI A,=100
	MOVE B,UPTIME
	SUB B,LUPTIME
	IDIV A,B
	MOVE D,[440700,,DPER4]
	PUSHJ P,DDECOUT
	PUSHJ P,DCRLF
	MOVE A,DQCNT
	MOVE D,[440700,,DQLEN]
	PUSHJ P,DDECOUT
	PUSHJ P,DCRLF
IFN OLDDSK,<
	MOVEI L,FQLIN
	PUSHJ P,DINI
	PUSHJ P,DQUEUE
>;IFN OLDDSK
	POPJ P,

IFN OLDDSK,<
DTAB:	MOVEI B,40
	PUSHJ P,.+1
	PUSHJ P,.+1
	PUSHJ P,DCHR
DCHR:	IDPB B,D
	TLNE D,760000
	POPJ P,
	PUSH Q,DWORD
DINI:	SETZM DWORD
	AOS DWORD
	MOVE D,[POINT 7,DWORD]
	POPJ P,

DFIN:	MOVE A,DWORD
	ANDCMI A,1
	JUMPE A,CPOPJ
	PUSH Q,DWORD
	POPJ P,

DEXT:	HLRZ A,A
	SKIPA C,[POINT 6,A,17]
DNAM:	MOVE C,[POINT 6,A]
DNAM1:	ILDB B,C
	ADDI B,40
	PUSHJ P,DCHR
	TLNE C,770000
	JRST DNAM1
	MOVEI B,"."
	POPJ P,

DPPN:	MOVEI B,"["
	PUSHJ P,DCHR
	PUSH P,A
	PUSHJ P,DEXT
	MOVEI B,","
	PUSHJ P,DCHR
	POP P,A
	HRLZ A,A
	PUSHJ P,DEXT
	MOVEI B,"]"
	JRST DCHR

DEOL:	MOVEI B,15
	PUSHJ P,DCHR
	MOVEI B,12
	AOJA L,DCHR

DDEC:	PUSH P,OUTXCT
	MOVE B,[PUSHJ P,DCHR]
	MOVEM B,OUTXCT
	PUSHJ P,DECOUT
	POP P,OUTXCT
	POPJ P,

DOCT:	PUSH P,OUTXCT
	MOVE B,[PUSHJ P,DCHR]
	MOVEM B,OUTXCT
	PUSHJ P,OCTOUT
	POP P,OUTXCT
	POPJ P,

DQUEUE:	SKIPN T,DQCNT		;SIZE OF DISK QUEUE
	POPJ P,
	MOVE TT,MOPTR
	SUB TT,AQBEGIN		;RELATIVE OUTPUT POINTER
	MOVE S,TT		;REMEMBER WHERE WE STARTED
DQUE1:	SKIPN C,QBEGIN(TT)	;GET DISK QUEUE ENTRY
	JRST DQUE2
	HLRZ DDB,C
	HRRZ DAT,C
	SKIPN A,@NAMPTR
	JRST DQUE2
	PUSHJ P,DNAM
	SKIPN A,@EXTPTR
	JRST DQUE1A
	PUSHJ P,DCHR		;PRINT THE DOT
	PUSHJ P,DEXT
DQUE1A:	MOVE A,@PPNPTR
	PUSHJ P,DPPN
	PUSHJ P,DTAB
	PUSHJ P,PSUBR
	PUSHJ P,DEOL
	SOJLE T,CPOPJ
DQUE2:	ADDI TT,1
	CAIN TT,QEND-QBEGIN
	MOVEI TT,0
	CAIE TT,(S)		;SKIP IF WE HAVE LOOPED BACK TO WHERE WE STARTED
	JRST DQUE1
	POPJ P,

CLRRST:	SUBI L,=35		;- NUMBER OF LINES TO CLEAR
CLRRS1:	MOVEI B,40
	PUSHJ P,DCHR
	MOVEI B,15
	PUSHJ P,DCHR
	MOVEI B,12
	PUSHJ P,DCHR
	AOJL L,CLRRS1
	PUSHJ P,DFIN
	POPJ P,

PSUBR:	MOVSI A,-NSUBRS
PSUBR1:	CAME DAT,SBRVAL(A)
	AOBJN A,PSUBR1
	JUMPL A,PSUBR2		;JUMP IF FOUND
	MOVE A,DAT
	JRST DOCT

PSUBR2:	MOVE A,SBRNAM(A)
	JRST DNAM
>;IFN OLDDSK
DPERCNT:IDIVI A,=100
	PUSH P,B
	PUSHJ P,DDECOUT
	MOVEI A,"."
	IDPB A,D
	POP P,A
	MOVEI B,"0"
	CAIGE A,=10
	IDPB B,D
	JRST DDECOUT

SYMLK:	MOVSI A,-NSYMS
SYMLK1:	MOVE B,SYMNAM(A)
	MOVE C,BLKNAM(A)
	MOVEI D,B
	.SYML D,
	JRST 4,.		;LOST
	MOVEM D,SYMVAL(A)
	AOBJN A,SYMLK1
CPOPJ:	POPJ P,

SYMEXM:	MOVSI A,-NSAVTB
SYMEX0:	HLRZ B,SAVTB(A)
	HRRZ C,SAVTB(A)
	MOVE B,(B)
	MOVEM B,(C)
	AOBJN A,SYMEX0
	MOVSI A,-NEVALS
SYMEX1:	HLRZ B,EVALTB(A)
	MOVE B,(B)		;GET ADDRESS OF SYSTEM SYMBOL
	MOVE B,HS(B)		;GET CONTENTS OF ADDRESS IN SYSTEM
	HRRZ C,EVALTB(A)
	MOVEM B,(C)
	AOBJN A,SYMEX1
	MOVE B,ADKTIME
	DMOVE B,HS(B)		;GET DOUBLE WORD TIME
	DMOVEM B,DKTIME
IFN OLDDSK,<
	HRLZ A,AQBEGIN
	ADD A,[HS,,QBEGIN]
	BLT A,QBEGIN+27
	MOVE A,SLOPC		;NUMBER OF WORDS IN GETHI LOW PIECE
	ADDI A,HS		;STARTING ADDRESS OF GETHI HI PIECE
	SUB A,FHIADR		;SUBTRACT OFFSET OF SYSTEM ADDRESS OF HI PIECE
	HRLI A,DDB
	MOVE B,A
	ADD B,AFILNAM
	MOVEM B,NAMPTR
	MOVE B,A
	ADD B,AFILEXT
	MOVEM B,EXTPTR
	MOVE B,A
	ADD B,AFILPPN
	MOVEM B,PPNPTR
>;IFN OLDDSK
	POPJ P,

DDPSET:	MOVSI A,-NDDCLR
	MOVEI B,1
DDPSE1:	MOVEM B,@DDPCTB(A)
	AOBJN A,DDPSE1
	POPJ P,

DCRLF:	MOVEI A,[BYTE (7) 15,12]
DTYPE:	HRLI A,440700
DTYPE1:	ILDB B,A
	JUMPE B,CPOPJ
	IDPB B,D
	JRST DTYPE1

DDECOUT:PUSH P,OUTXCT
	MOVE B,[IDPB B,D]
	MOVEM B,OUTXCT
	PUSHJ P,DECOUT
	POP P,OUTXCT
	POPJ P,

DECOUT:	PUSH P,C
	MOVEI C,=10
	PUSHJ P,NUMOUT
	POP P,C
	POPJ P,

OCTOUT:	PUSH P,C
	MOVEI C,10
	PUSHJ P,NUMOUT
	POP P,C
	POPJ P,

NUMOUT:	IDIVI A,(C)
	JUMPE A,NUMOU1
	HRLM B,(P)
	PUSHJ P,NUMOUT
	HLRZ B,(P)
NUMOU1:	ADDI B,"0"
	XCT OUTXCT
	POPJ P,
IFN OLDDSK,<
DEFINE ISYMS
<FOR I IN (NTSTAR,NSWPOP,DSKTWC,SWPTWC,DQCNT,QBEGIN,MIPTR,MOPTR,FILNAM,<FILEXT>
,FILPPN,DKTIME,NJRNUL,UPTIME,NWSCHED)>
>;IFN OLDDSK
IFE OLDDSK,<
DEFINE ISYMS
<FOR I IN (NTSTAR,NSWPOP,DSKTWC,SWPTWC,DQCNT,FILNAM,<FILEXT>
,FILPPN,DKTIME,NJRNUL,UPTIME,NWSCHED)>
>;IFE OLDDSK

IFN OLDDSK,<
DEFINE ISUBRS
<FOR I IN (LOOKI,DIDMPI,DMPIBI,DIDMPO,DMPOBI,DRAUFY,DRAUFD,DCLOI,SPREAD,<DIRSRC>
,DIRI1,DIRI2,GGRETI,RB4WCK,DELFIL,DIBUFI,DIBUFO,DCLSO5,DRINT,DRINT1,SATOUT)>
>;IFN OLDDSK

DEFINE SYMS (J)
<IFDIF <J><UNUSED><RADIX50 0,J>>

SYMNAM:	ISYMS <SYMS(I)
>
IFN OLDDSK,<
	ISUBRS <SYMS(I)
>
>;IFN OLDDSK
NSYMS←←.-SYMNAM

BLKNAM:	REPEAT 5,<0>
IFN OLDDSK,<REPEAT 3,<0>>
	REPEAT 3,<RADIX50 0,WAITS>
	REPEAT NSYMS-5-IFN OLDDSK,<3->3,<0>

DEFINE SYMS ! (J)
<IFDIF <J><UNUSED><A!J:0>>
DEFINE SYMS1 (J)
<IFDIF <J><UNUSED><0>>

SYMVAL::ISYMS <SYMS(I)
>
IFN OLDDSK,<
SBRVAL:	ISUBRS <SYMS1(I)
>
NSUBRS←←.-SBRVAL

DEFINE SYMS (J)
<IFDIF <J><UNUSED><SIXBIT /J/>>
SBRNAM:	ISUBRS <SYMS(I)
>
>;IFN OLDDSK

EVALTB:	ANTSTAR,,NTSTAR
	ANSWPOP,,NSWPOP
	ADSKTWC,,DSKTWC
	ASWPTWC,,SWPTWC
	ADQCNT,,DQCNT
IFN OLDDSK,<
	AMIPTR,,MIPTR
	AMOPTR,,MOPTR
>;IFN OLDDSK
	ANJRNUL,,NJRNUL
	AUPTIME,,UPTIME
	ANWSCHED,,NWSCHED
NEVALS←←.-EVALTB

SAVTB:	NJRNUL,,LNJRNUL
	UPTIME,,LUPTIME
	NWSCHED,,LNWSCHED
NSAVTB←←.-SAVTB

NTSTAR:	0
NSWPOP:	0
DSKTWC:	0
SWPTWC:	0
DQCNT:	0
DKTIME:	BLOCK 2
NJRNUL:	0
LNJRNUL:0
UPTIME:	0
LUPTIME:0
NWSCHED:0
LNWSCHED:0

IFN OLDDSK,<
QBEGIN:	BLOCK 30		;COPY OF THE SYSTEM'S DISK QUEUE
QEND::
MIPTR:	0
MOPTR:	0
>;IFN OLDDSK

PDL:	BLOCK 100
SPWPDL:	BLOCK 100
SWCNT:	0
DEBUG:	0
SLOPC:	0			;NUMBER OF WORDS IN GETHI LOW PIECE
FHIADR:	0			;FIRST SYSTEM ADDRESS IN GETHI HI PIECE
OUTXCT:	OUTCHR B
NAMPTR:	0
EXTPTR:	0
PPNPTR:	0
FREEZE:	0

DDHEAD:	600000,,DDPROG
DDLWRD:	0
	0
	DDPRGL

DDPROG:	CW(FN,46,FN,46,FN,46)
DDPRGL:	CW(COL,2,HILINE,FSLINE⊗-4,LOLINE,FLINE&17)
	ASCID /          DSKMON  Disk statistics monitoring program

NUMBER OF SWAP OPS = /
DSWPOP:	BLOCK 3		;ROOM FOR 11 DIGITS, CR AND LF
	ASCID /NUMBER OF OTHER DISK OPS = /
DTSTAR:	BLOCK 3
	ASCID /PERCENTAGE OF SWAP OPS = /
DPER1:	BLOCK 3
REPEAT 0,<
	ASCID /TOTAL WORDS SWAPPED = /
DSWPTW:	BLOCK 3
	ASCID /TOTAL WORDS TRANSFERRED = /
DDSKTW:	BLOCK 3
>;END REPEAT 0
	ASCID /PERCENTAGE OF WORDS SWAPPED = /
DPER2:	BLOCK 3
	ASCID /AVERAGE SWAP TRANSFER SIZE = /
DSIZ1:	BLOCK 3
	ASCID /AVERAGE DISK TRANSFER SIZE = /
DSIZ2:	BLOCK 3
	ASCID /AVERAGE DISK TRANSFER RATE = /
DRATE:	BLOCK 3
	ASCID /PERCENTAGE OF WASTED TICKS = /
DPER3:	BLOCK 3
	ASCID /WSCHEDS PER 100 TICKS = /
DPER4:	BLOCK 3
	ASCID /DISK QUEUE LENGTH = /
DQLEN:	BLOCK 3
IFN OLDDSK,<
	ASCID /DISK QUEUE:
/
FQLIN←←=12+FLINE
DDPRG1:	BLOCK DDPMAX
>;IFN OLDDSK
	0
DDPEND::

DWORD:	0

DDPCTB:	DDCLR DSWPOP,3
	DDCLR DTSTAR,3
	DDCLR DPER1,3
;	DDCLR DSWPTW,3
;	DDCLR DDSKTW,3
	DDCLR DPER2,3
	DDCLR DSIZ1,3
	DDCLR DSIZ2,3
	DDCLR DRATE,3
	DDCLR DQLEN,3
	DDCLR DPER3,3
	DDCLR DPER4,3
NDDCLR←←.-DDPCTB

DDCLRS:	DDCLRP
	2
	0
	0

DDCLRP:	CW(FN,17,CH,0,CH,0)
	0

	END GO